import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib

# 设置默认字体为 SimSun
matplotlib.rcParams['font.sans-serif'] = ['SimSun']  # 中文字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示为方块的问题

# 修改文件路径为原始字符串或者使用正斜杠
df = pd.read_csv(r"C:\Users\卷\Desktop\程序\Pycharm\data uncovered\douyin_dataset.csv")
print(df.head())

# 删除不必要的列
del df['Unnamed: 0']

# 打印数据基本信息和空值计数
print(df.info())
print(df.isnull().sum())

# 用户数据处理
user_df = pd.DataFrame()
user_df['uid'] = df.groupby('uid')['like'].count().index.tolist()  # 提取所有用户的uid
user_df.set_index('uid', inplace=True)  # 设置uid列为索引
user_df['浏览量'] = df.groupby('uid')['like'].count()  # 统计对应uid下的浏览量
user_df['点赞量'] = df.groupby('uid')['like'].sum()  # 统计对应uid下的点赞量
user_df['观看作者数'] = df.groupby('uid')['author_id'].nunique()  # 观看作者数
user_df['观看作品数'] = df.groupby('uid')['item_id'].nunique()  # 观看作品数
user_df['观看作品平均时长'] = df.groupby('uid')['duration_time'].mean()  # 浏览作品平均时长
user_df['观看配乐数'] = df.groupby('uid')['music_id'].nunique()  # 观看作品中配乐的数量
user_df['完整观看数'] = df.groupby('uid')['finish'].sum()  # 统计对应uid下的完整观看数
user_df['去过的城市数'] = df.groupby('uid')['user_city'].nunique()  # 去过的城市数量
user_df['观看作品城市数'] = df.groupby('uid')['item_city'].nunique()  # 观看作品城市数量
print(user_df.describe())

# 用户数据可视化
# 绘制浏览量的直方图
plt.figure(figsize=(10, 6))
sns.histplot(user_df['浏览量'], kde=True)
plt.title('用户浏览量分布')
plt.xlabel('浏览量')
plt.ylabel('频率')
plt.show()

# 查看点赞量和浏览量之间的关系（散点图）
plt.figure(figsize=(10, 6))
sns.scatterplot(data=user_df, x='浏览量', y='点赞量')
plt.title('用户点赞量与浏览量的关系')
plt.xlabel('浏览量')
plt.ylabel('点赞量')
plt.show()

# 将用户特征保存到 CSV 文件
user_df.to_csv('用户特征.csv', encoding='utf_8_sig')

# 作者数据处理
author_df = pd.DataFrame()
author_df['author_id'] = df.groupby('author_id')['like'].count().index.tolist()
author_df.set_index('author_id', inplace=True)
author_df['总浏览量'] = df.groupby('author_id')['like'].count()
author_df['总点赞量'] = df.groupby('author_id')['like'].sum()
author_df['总观完量'] = df.groupby('author_id')['finish'].sum()
author_df['总作品数'] = df.groupby('author_id')['item_id'].nunique()

# 计算作品平均时长
item_time = df.groupby(['author_id', 'item_id'])['duration_time'].mean().reset_index()
author_df['作品平均时长'] = item_time.groupby('author_id')['duration_time'].mean()

author_df['使用配乐数量'] = df.groupby('author_id')['music_id'].nunique()
author_df['发布作品日数'] = df.groupby('author_id')['real_time'].nunique()

# 计算创作活跃度
author_days = df.groupby('author_id')['date']
date_diff = pd.to_datetime(author_days.max()) - pd.to_datetime(author_days.min())
author_df['创作活跃度(日)'] = date_diff.dt.days + 1
author_df['去过的城市数'] = df.groupby('author_id')['item_city'].nunique()
print(author_df.describe())

# 作者数据可视化
# 绘制总点赞量和总浏览量的关系（散点图）
plt.figure(figsize=(10, 6))
sns.scatterplot(data=author_df, x='总浏览量', y='总点赞量')
plt.title('作者总点赞量与总浏览量的关系')
plt.xlabel('总浏览量')
plt.ylabel('总点赞量')
plt.show()

# 绘制作者创作活跃度的分布（箱线图）
plt.figure(figsize=(10, 6))
sns.boxplot(x=author_df['创作活跃度(日)'])
plt.title('作者创作活跃度分布')
plt.xlabel('创作活跃度（日）')
plt.show()

# 将作者特征保存到 CSV 文件
author_df.to_csv('作者特征.csv', encoding='utf_8_sig')

# 作品数据处理
item_df = pd.DataFrame()
item_df['item_id'] = df.groupby('item_id')['like'].count().index.tolist()
item_df.set_index('item_id', inplace=True)
item_df['浏览量'] = df.groupby('item_id')['like'].count()
item_df['点赞量'] = df.groupby('item_id')['like'].sum()
item_df['发布城市'] = df.groupby('item_id')['item_city'].mean()
item_df['背景音乐'] = df.groupby('item_id')['music_id'].nunique()

# 作品数据可视化
# 绘制作品浏览量和点赞量的关系（散点图）
plt.figure(figsize=(10, 6))
sns.scatterplot(data=item_df, x='浏览量', y='点赞量')
plt.title('作品点赞量与浏览量的关系')
plt.xlabel('浏览量')
plt.ylabel('点赞量')
plt.show()

# 绘制作品背景音乐数量的分布（直方图）
plt.figure(figsize=(10, 6))
sns.histplot(item_df['背景音乐'], kde=True)
plt.title('作品背景音乐数量分布')
plt.xlabel('背景音乐数量')
plt.ylabel('频率')
plt.show()

# 将作品特征保存到 CSV 文件
item_df.to_csv('作品特征.csv', encoding='utf_8_sig')